namespace oib {
    let obj: {};

    obj = true;
    obj = "hi";
    obj = 1;
    obj = {foo: 123};
    obj = [1, 2];
    obj = (a: number) => a + 1;

// 上面示例中，变量obj的类型是空对象{}，就代表Object类型。

// 显然，无所不包的Object类型既不符合直觉，也不方便使用。

// 大写的Object类型代表 JavaScript 语言里面的广义对象。所有可以转成对象的值，都是Object类型，这囊括了几乎所有的值。
// 上面示例中，undefined和null赋值给Object类型，就会报错。

// 另外，空对象{}是Object类型的简写形式，所以使用Object时常常用空对象代替。
    let obje: Object
    obje = true;
    obje = "hi";
    obje = 1;
    obje = {foo: 123};
    obje = [1, 2];
    obje = (a: number) => a + 1;

// obj = undefined; // 报错
// obj = null; // 报错


// 但是如果指定为小写的object就只能赋值 数组对象函数
    let objee: object
// objee=true  错
// objee="hi" 错
    objee = [1]
    objee = function () {
    }
    objee = {}
}


// 类型	             含义                                                             是否推荐	  举例
// object（小写）	所有非原始类型（非 number/string/boolean/null/undefined/symbol/bigint）	✅ 推荐	 {}, [], function() {}
// Object（大写）	JavaScript 中的构造函数 Object 的类型，允许原始类型被包装（不安全）	       ❌ 不推荐	"hello", 42, true 都可以赋给它